﻿Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Imports Lourdes.BackEnd.Modelo


Namespace BC
  Public Class ReportSources
#Region "CHARTS"

#Region "Generación de rango de fechas"
    Private Function getFechaMesDesde() As DateTime
      Dim dias As Integer = 30
      Return New Date(Now.AddDays(-dias).Year, Now.AddDays(-dias).Month, Now.AddDays(-dias).Day, 0, 0, 0)
    End Function
    Private Function getFechaMesHasta()
      Return New Date(Now.Year, Now.Month, Now.Day, 23, 59, 59)
    End Function

    Private Function getFechaSemanaDesde() As DateTime
      Dim dias As Integer = 7
      Return New Date(Now.AddDays(-dias).Year, Now.AddDays(-dias).Month, Now.AddDays(-dias).Day, 0, 0, 0)
    End Function
    Private Function getFechaSemanaHasta()
      Return New Date(Now.Year, Now.Month, Now.Day, 23, 59, 59)
    End Function

    Private Function getFechaDiaDesde() As DateTime
      Return New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
    End Function
    Private Function getFechaDiaHasta()
      Return New Date(Now.Year, Now.Month, Now.Day, 23, 59, 59)
    End Function
#End Region

#Region "VENTAS"
    Public Function getVentasMes() As DataTable
      Return getVentasByRango(getFechaMesDesde, getFechaMesHasta)
    End Function

    Public Function getVentasSemana() As DataTable
      Return getVentasByRango(getFechaSemanaDesde, getFechaSemanaHasta)
    End Function

    Public Function getVentasDia() As DataTable
      Return getVentasByRango(getFechaDiaDesde, getFechaDiaHasta)
    End Function

    Public Function getVentasByRango(pDesde As Date, pHasta As Date) As DataTable
      Dim objCont As LourdesEntities = ContextFactory.GetContext
      Dim dt As New DataTable
      Dim dr As DataRow
      Dim fi As DateTime = pDesde
      Dim fi_desde As DateTime
      Dim fi_hasta As DateTime
      Dim strHeaderName As String
      Dim resu = (From f In objCont.Factura _
                  Where f.Documento.FechaDocumento >= pDesde _
                  And f.Documento.FechaDocumento <= pHasta _
                  Select fec = f.Documento.FechaDocumento, tot = f.TotalNeto Order By fec).ToList

      dr = dt.NewRow

      'Si es menor a un día en el eje horizontal se van a mostrar horas.
      If (pHasta - pDesde).Days = 0 Then
        fi_desde = New Date(fi.Year, fi.Month, fi.Day, 0, 0, 0)
        fi_hasta = New Date(fi.Year, fi.Month, fi.Day, 23, 59, 59)
        Do While fi_desde.Ticks < fi_hasta.Ticks
          strHeaderName = fi_desde.ToString("HH:mm")
          dt.Columns.Add(strHeaderName, GetType(Double))
          dr(strHeaderName) = (From r In resu Where r.fec >= fi_desde And r.fec < fi_desde.AddHours(1)).Sum(Function(o) o.tot)
          fi_desde = fi_desde.AddHours(1)
        Loop

        'Al ser mayor a un día en el eje horizontal se van a mostrar días.
      Else
        Do While fi.Ticks <= pHasta.Ticks
          fi_desde = New Date(fi.Year, fi.Month, fi.Day, 0, 0, 0)
          fi_hasta = New Date(fi.Year, fi.Month, fi.Day, 23, 59, 59)
          strHeaderName = fi.ToString("dd-MMMM")
          dt.Columns.Add(strHeaderName, GetType(Double))
          dr(strHeaderName) = (From r In resu Where r.fec >= fi_desde And r.fec <= fi_hasta).Sum(Function(o) o.tot)
          fi = fi.AddDays(1)
        Loop
      End If

      dt.Rows.Add(dr)
      Return dt

    End Function
#End Region

#Region "VENTAS POR VENDEDORES"

    Public Function getVendedoresMes() As DataTable
      Return getVendedoresByRango(getFechaMesDesde, getFechaMesHasta)
    End Function

    Public Function getVendedoresSemana() As DataTable
      Return getVendedoresByRango(getFechaSemanaDesde, getFechaSemanaHasta)
    End Function

    Public Function getVendedoresDia() As DataTable
      Return getVendedoresByRango(getFechaDiaDesde, getFechaDiaHasta)
    End Function

    Public Function getVendedoresByRango(pDesde As Date, pHasta As Date) As DataTable
      Dim objCont As LourdesEntities = ContextFactory.GetContext
      Dim dt As New DataTable

      With dt.Columns
        .Add("Vendedor", GetType(String))
        .Add("Monto", GetType(Double))
      End With

      Dim resu = (From f In objCont.Factura
                 Where f.Documento.FechaDocumento >= pDesde _
                 And f.Documento.FechaDocumento <= pHasta _
                 Group f By f.VendedorPerId Into g = Group _
                 Select New With {.Vendedor = g.FirstOrDefault.Persona1.Nombre & " " & g.FirstOrDefault.Persona1.Apellido, _
                                  .Monto = g.Sum(Function(o) o.TotalNeto)}).ToList

      If resu.Count = 0 Then Return Nothing

      dt = resu.Select(Function(o) dt.LoadDataRow(New Object() {o.Vendedor, o.Monto}, False)).CopyToDataTable


      Return dt
    End Function
#End Region

#Region "MERCADERÍAS MAS VENDIDAS"
    Public Function getMercaMes() As DataTable
      Return getMercaByRango(getFechaMesDesde, getFechaMesHasta)
    End Function

    Public Function getMercaSemana() As DataTable
      Return getMercaByRango(getFechaSemanaDesde, getFechaSemanaHasta)
    End Function

    Public Function getMercaDia() As DataTable
      Return getMercaByRango(getFechaDiaDesde, getFechaDiaHasta)
    End Function

    Public Function getMercaByRango(pDesde As Date, pHasta As Date) As DataTable
      Dim objCont As LourdesEntities = ContextFactory.GetContext
      Dim dt As New DataTable

      With dt.Columns
        .Add("Mercaderia", GetType(String))
        .Add("Monto", GetType(Double))
      End With

      Dim resu = (From f In objCont.FacturaDetalle
                 Where f.Factura.Documento.FechaDocumento >= pDesde _
                 And f.Factura.Documento.FechaDocumento <= pHasta _
                 Group f By f.MercaderiaId Into g = Group _
                 Select New With {.Mercaderia = g.FirstOrDefault.Mercaderia.NombreCorto, _
                                  .Monto = g.Sum(Function(o) o.TotalLinea)}).ToList

      If resu.Count = 0 Then Return Nothing

      dt = resu.Select(Function(o) dt.LoadDataRow(New Object() {o.Mercaderia, o.Monto}, False)).CopyToDataTable
      Return dt
    End Function

#End Region

#Region "VENTAS POR CLIENTES"
    Public Function getClientesMes() As DataTable
      Return getClientesByRango(getFechaMesDesde, getFechaMesHasta)
    End Function

    Public Function getClientesSemana() As DataTable
      Return getClientesByRango(getFechaSemanaDesde, getFechaSemanaHasta)
    End Function

    Public Function getClientesDia() As DataTable
      Return getClientesByRango(getFechaDiaDesde, getFechaDiaHasta)
    End Function

    Public Function getClientesByRango(pDesde As Date, pHasta As Date) As DataTable
      Dim objCont As LourdesEntities = ContextFactory.GetContext
      Dim dt As New DataTable

      With dt.Columns
        .Add("Cliente", GetType(String))
        .Add("Monto", GetType(Double))
      End With

      Dim resu = (From f In objCont.Factura
                 Where f.Documento.FechaDocumento >= pDesde _
                 And f.Documento.FechaDocumento <= pHasta _
                 Group f By f.ClientePerId Into g = Group _
                 Select New With {.Cliente = g.FirstOrDefault.Persona.Nombre & " " & g.FirstOrDefault.Persona.Apellido, _
                                  .Monto = g.Sum(Function(o) o.TotalNeto)}).ToList

      If resu.Count = 0 Then Return Nothing

      dt = resu.Select(Function(o) dt.LoadDataRow(New Object() {o.Cliente, o.Monto}, False)).CopyToDataTable
      Return dt
    End Function
#End Region

#End Region

#Region "REPORTS"
    Public Function getFactura(ByVal pFacturaId As Integer) As Object
      Dim objCont As LourdesEntities = ContextFactory.GetContext
      Try
        Dim resu = (From fd In objCont.FacturaDetalle _
                   Where fd.FacturaId = pFacturaId _
                   Select DocId = fd.Factura.DocId, FacturaId = fd.Factura.FacturaId, ClientePerId = fd.Factura.ClientePerId, ClientePerNombre = fd.Factura.ClientePerNombre,
                                ClientePerApellido = fd.Factura.ClientePerApellido, TotalBruto = fd.Factura.TotalBruto, Descuentos = fd.Factura.Descuentos, GastosAdicionales = fd.Factura.GastosAdicionales,
                                Impuestos = fd.Factura.Impuestos, TotalNeto = fd.Factura.TotalNeto, FechaVencimiento = fd.Factura.FechaVencimiento, FechaCreacion = fd.Factura.Documento.FechaCreacion,
                                FechaDocumento = fd.Factura.Documento.FechaDocumento, Descripcion = fd.Descripcion, PrecioUnitario = fd.PrecioUnitario, Cantidad = fd.Cantidad,
                                TotalLinea = fd.TotalLinea, Calle = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.Calle, _
                                Numero = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.Numero, _
                                Piso = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.Piso, _
                                Departamento = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.Departamento, _
                                Barrio = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.Barrio, _
                                CodigoPostal = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.CodigoPostal, _
                                Ciudad = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.Ciudad.Nombre, _
                                Provincia = fd.Factura.Persona.PersonaDomicilio.Where(Function(o) o.EsPrincipal).FirstOrDefault.Provincia.Nombre).ToList

        Return resu
      Catch ex As Exception
        Throw ex
      End Try
    End Function

    Public Function getRemito(ByVal pRemitoId As Integer) As Object
      Dim objCont As LourdesEntities = ContextFactory.GetContext
      Try
        Dim resu = (From d In objCont.DocRemitoDet _
                   Where d.DocRemitoId = pRemitoId _
                   Select DocRemitoId = d.DocRemito.DocRemitoId, ClientePerNombre = d.DocRemito.ClientePerNombre,
                                ClientePerApellido = d.DocRemito.ClientePerApellido, FechaDeEntrega = d.DocRemito.FechaDeEntrega,
                                Descripcion = d.Descripcion, Cantidad = d.Cantidad).ToList
        Return resu
      Catch ex As Exception
        Throw ex
      End Try
    End Function

    Public Function getRecibo(ByVal pDocReciboId As Integer) As Object
      Dim objCont As LourdesEntities = ContextFactory.GetContext
      Try
        Dim resu = (From r In objCont.DocRecibo _
                   Where r.DocReciboId = pDocReciboId _
                   Select DocNumero = r.Documento.DocNumero, ClientePerNombre = r.ClientePerNombre,
                          ClientePerApellido = r.ClientePerApellido, Monto = r.Monto,
                          MontoTexto = r.MontoTexto, FechaDePago = r.FechaDePago, Concepto = r.Concepto).ToList

        Return resu
      Catch ex As Exception
        Throw ex
      End Try
    End Function
#End Region

  End Class
End Namespace